﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Blockmania.Classes;

namespace Blockmania.Classes
{

    class Laud
    {
        public const int ruudustiku_laius = 10;
        public const int ruudustiku_korgus = 18;

        // Mänguväli koosneb ruutudest, millel on enda olek
        // -1 tähistab  tühja ruutu
        // 0...6 värvilisi ruute
        // Esimene komponent on rida, teine tulp
        private int[,] mangulaud;

        #region Properties

        public int[,] GameGrid
        {
            get { return mangulaud; }
            set { mangulaud = value; }
        }

        #endregion

        // Constructor
        public Laud()
        {
            // Tekitame array ja sätime algväärtuseks kõigile ruutudele "-1"
            // kutsudes välja LooManguLaud().

            mangulaud = new int[ruudustiku_korgus, ruudustiku_laius];
            LooMangulaud();
        }


        public void LooMangulaud()
        {
            // See meetod sätib kõik mängulaua ruudud tühjaks

            for (int rida = 0; rida < ruudustiku_korgus; rida++)
                for (int tulp = 0; tulp < ruudustiku_laius; tulp++)
                    mangulaud[rida, tulp] = -1;
        }


        public void LisaKlotsLauale(Klots Klots)
        {
            // See meetod lisab tüki mängulaua osaks 

            for (int rida = 0; rida < 4; rida++)
                for (int tulp = 0; tulp < 4; tulp++)
                {
                    // Testime kas asukoht pole tühi
                    if (Klots.KLOTSID[Klots.Klotstyyp, Klots.Asend, rida, tulp] == 1)
                    {
                        mangulaud[Klots.PositionRow + rida, Klots.PositionCol + tulp] = Klots.Klotstyyp;
                    }
                }
        }


        public void JoonistaPaigutatudKlotsid(SpriteBatch spriteBatch)
        {
            // Joonistame kõik klotsid mis on mängulaual

            for (int rida = 0; rida < ruudustiku_korgus; rida++)
                for (int tulp = 0; tulp < ruudustiku_laius; tulp++)
                    if (mangulaud[rida, tulp] != -1)
                    {
                        Vector2 position;
                        position = Mootor.laua_ylemine_vasak_vektor
                                   + Mootor.GameCoorToScreenVec(rida, tulp);
                        spriteBatch.Begin();
                        spriteBatch.Draw(BlockManiaGame.TileTextures[GameGrid[rida, tulp]], position, Color.White);
                        spriteBatch.End();
                    }
        }


        public int KontrolliTaisRida()
        {
            // See meetod kontrollib täisridasid, ning siis eemaldab need
            // alla suunas ning returnib ridade arvu mis ära kaotati 0...4

            int numLines = 0;

            for (int rida = 0; rida < ruudustiku_korgus; rida++)
            {
                bool lineComplete = true;

                for (int tulp = 0; tulp < ruudustiku_laius; tulp++)
                {
                    if (mangulaud[rida, tulp] == -1)
                        lineComplete = false;
                }

                if (lineComplete)
                {
                    // Kui jõuame siis, siis on tegu räisreaga ja vaja ära kaotada

                    // Lisame reaarvule juurde
                    numLines++;

                    // Liigume ridadega alla ühe ruudu võrra
                    for (int i = rida; i > 0; i--)
                        for (int j = 0; j < Laud.ruudustiku_laius; j++)
                            mangulaud[i, j] = mangulaud[i - 1, j];

                    // Ülemine rida tühjaks
                    for (int j = 0; j < Laud.ruudustiku_laius; j++)
                        mangulaud[0, j] = -1;
                }
            }

            return numLines;
        }
    }
}